package com.meloinfo.common.service;

import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import com.google.common.collect.Lists;
import com.meloinfo.common.entity.AbstractEntity;
import com.meloinfo.common.entity.search.Searchable;
import com.meloinfo.common.repository.BaseRepository;

/**
 * 抽象service层基类，提供一些简便方法
 * @author 谢磊
 * 
 * @file BaseService.java
 * 
 * @description 
 * 
 * @date 2016年6月1日 下午12:11:25
 * 
 * @param <M>
 * @param <ID>
 */
public abstract class BaseService<M extends AbstractEntity, ID extends Serializable> {

	protected BaseRepository<M, ID> baseRepository;
	
	@Autowired
	public void setBaseRepository(BaseRepository<M, ID> baseRepository) {
		this.baseRepository = baseRepository;
	}
	
	public M save(M m) {
		return baseRepository.save(m);
	}
	
	public M saveAndFlush(M m) {
		m = save(m);
		baseRepository.flush();
		return m;
	}
	
	public M update(M m) {
		return baseRepository.save(m);
	}
	
	/**
     * 根据主键删除相应实体
     *
     * @param id 主键
     */
	public void delete(ID id) {
		baseRepository.delete(id);
	}
	
	/**
     * 删除实体
     *
     * @param m 实体
     */
    public void delete(M m) {
        baseRepository.delete(m);
    }
	
    /**
     * 根据主键删除相应实体
     *
     * @param ids 实体
     */
	public void delete(ID[] ids) {
		baseRepository.delete(ids);
	}
	
	public M findOne(ID id) {
		return baseRepository.findOne(id);
	}
	
	public boolean exists(ID id) {
		return baseRepository.exists(id);
	}
	
	public long count() {
		return baseRepository.count();
	}
	
	public List<M> findAll() {
		return baseRepository.findAll();
	}
	
	/**
     * 按照顺序查询所有实体
     *
     * @param sort
     * @return
     */
	public List<M> findAll(Sort sort) {
		return baseRepository.findAll(sort);
	}
	
	/**
     * 分页及排序查询实体
     *
     * @param pageable 分页及排序数据
     * @return
     */
	public Page<M> findAll(Pageable pageable) {
		return baseRepository.findAll(pageable);
	}
	
	/**
     * 按条件分页并排序查询实体
     *
     * @param searchable 条件
     * @return
     */
	public Page<M> findAll(Searchable searchable) {
        return baseRepository.findAll(searchable);
    }
	
	/**
     * 按条件不分页不排序查询实体
     *
     * @param searchable 条件
     * @return
     */
    public List<M> findAllWithNoPageNoSort(Searchable searchable) {
        searchable.removePageable();
        searchable.removeSort();
        return Lists.newArrayList(baseRepository.findAll(searchable).getContent());
    }
    
    /**
     * 按条件排序查询实体(不分页)
     *
     * @param searchable 条件
     * @return
     */
    public List<M> findAllWithSort(Searchable searchable) {
        searchable.removePageable();
        return Lists.newArrayList(baseRepository.findAll(searchable).getContent());
    }
    
    /**
     * 按条件分页并排序统计实体数量
     *
     * @param searchable 条件
     * @return
     */
    public Long count(Searchable searchable) {
        return baseRepository.count(searchable);
    }
}
